<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/atomic.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/atomic.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/* Atomic operations usable in machine independent code */</span>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0FUT01JQ19IXzA_"><span class="b">_LINUX_ATOMIC_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0FUT01JQ19IXzA_"><span class="b">_LINUX_ATOMIC_H</span></a>
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">atomic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="Maybe">       5:</span> 
<a name="6" /><span class="Maybe">       6:</span> <span class="k">/**</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="k"> * atomic_add_unless - add unless the number is already a given value</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="k"> * @v: pointer of type atomic_t</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="k"> * @a: the amount to add to v...</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="k"> * @u: ...unless v is equal to u.</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="k"> *</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="k"> * Atomically adds @a to @v, so long as @v was not already @u.</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="k"> * Returns non-zero if @v was not @u, and zero otherwise.</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="k"> */</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic_add_unless</span><span class="f">(</span><span class="b">atomic_t</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">int</span> <span class="b">a</span><span class="f">,</span> <span class="m">int</span> <span class="b">u</span><span class="f">)</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="f">{</span>
<a name="17" /><span class="Maybe">      17:</span>     <span class="m">return</span> <span class="b">__atomic_add_unless</span><span class="f">(</span><span class="b">v</span><span class="f">,</span> <span class="b">a</span><span class="f">,</span> <span class="b">u</span><span class="f">)</span> <span class="f">!=</span> <span class="b">u</span><span class="f">;</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="f">}</span>
<a name="19" /><span class="Maybe">      19:</span> 
<a name="20" /><span class="Maybe">      20:</span> <span class="k">/**</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="k"> * atomic_inc_not_zero - increment unless the number is zero</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k"> * @v: pointer of type atomic_t</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k"> *</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k"> * Atomically increments @v by 1, so long as @v is non-zero.</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="k"> * Returns non-zero if @v was non-zero, and zero otherwise.</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="k"> */</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_YXRvbWljX2luY19ub3RfemVyb18w"><span class="b">atomic_inc_not_zero</span></a>
<a name="28" /><span class="Maybe">      28:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YXRvbWljX2luY19ub3RfemVyb18w"><span class="b">atomic_inc_not_zero</span></a><span class="f">(</span><span class="b">v</span><span class="f">)</span>        <span class="b">atomic_add_unless</span><span class="f">(</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">,</span> <span class="c">1</span><span class="f">,</span> <span class="c">0</span><span class="f">)</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="f">#</span><span class="n">endif</span>
<a name="30" /><span class="Maybe">      30:</span> 
<a name="31" /><span class="Maybe">      31:</span> <span class="k">/**</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> * atomic_inc_not_zero_hint - increment if not null</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="k"> * @v: pointer of type atomic_t</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="k"> * @hint: probable value of the atomic before the increment</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> *</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k"> * This version of atomic_inc_not_zero() gives a hint of probable</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> * value of the atomic. This helps processor to not read the memory</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * before doing the atomic read/modify/write cycle, lowering</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> * number of bus transactions on some arches.</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> *</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="k"> * Returns: 0 if increment was not done, 1 otherwise.</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="k"> */</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">atomic_inc_not_zero_hint</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic_inc_not_zero_hint</span><span class="f">(</span><span class="b">atomic_t</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">int</span> <span class="b">hint</span><span class="f">)</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="f">{</span>
<a name="46" /><span class="Maybe">      46:</span>     <span class="m">int</span> <span class="b">val</span><span class="f">,</span> <span class="b">c</span> <span class="f">=</span> <span class="b">hint</span><span class="f">;</span>
<a name="47" /><span class="Maybe">      47:</span> 
<a name="48" /><span class="Maybe">      48:</span>     <span class="k">/* sanity test, should be removed by compiler if hint is a constant */</span>
<a name="49" /><span class="Maybe">      49:</span>     <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="b">hint</span><span class="f">)</span>
<a name="50" /><span class="Maybe">      50:</span>         <span class="m">return</span> <a href="cpu.c_macros_ref.html#_YXRvbWljX2luY19ub3RfemVyb18w"><span class="b">atomic_inc_not_zero</span></a><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="51" /><span class="Maybe">      51:</span> 
<a name="52" /><span class="Maybe">      52:</span>     <span class="m">do</span> <span class="f">{</span>
<a name="53" /><span class="Maybe">      53:</span>         <span class="b">val</span> <span class="f">=</span> <span class="b">atomic_cmpxchg</span><span class="f">(</span><span class="b">v</span><span class="f">,</span> <span class="b">c</span><span class="f">,</span> <span class="b">c</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">;</span>
<a name="54" /><span class="Maybe">      54:</span>         <span class="m">if</span> <span class="f">(</span><span class="b">val</span> <span class="f">==</span> <span class="b">c</span><span class="f">)</span>
<a name="55" /><span class="Maybe">      55:</span>             <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="56" /><span class="Maybe">      56:</span>         <span class="b">c</span> <span class="f">=</span> <span class="b">val</span><span class="f">;</span>
<a name="57" /><span class="Maybe">      57:</span>     <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="b">c</span><span class="f">)</span><span class="f">;</span>
<a name="58" /><span class="Maybe">      58:</span> 
<a name="59" /><span class="Maybe">      59:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="f">}</span>
<a name="61" /><span class="Maybe">      61:</span> <span class="f">#</span><span class="n">endif</span>
<a name="62" /><span class="Maybe">      62:</span> 
<a name="63" /><span class="Maybe">      63:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">atomic_inc_unless_negative</span>
<a name="64" /><span class="Maybe">      64:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic_inc_unless_negative</span><span class="f">(</span><span class="b">atomic_t</span> <span class="f">*</span><span class="b">p</span><span class="f">)</span>
<a name="65" /><span class="Maybe">      65:</span> <span class="f">{</span>
<a name="66" /><span class="Maybe">      66:</span>     <span class="m">int</span> <span class="b">v</span><span class="f">,</span> <span class="b">v1</span><span class="f">;</span>
<a name="67" /><span class="Maybe">      67:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">v</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span> <span class="b">v</span> <span class="f">&gt;=</span> <span class="c">0</span><span class="f">;</span> <span class="b">v</span> <span class="f">=</span> <span class="b">v1</span><span class="f">)</span> <span class="f">{</span>
<a name="68" /><span class="Maybe">      68:</span>         <span class="b">v1</span> <span class="f">=</span> <span class="b">atomic_cmpxchg</span><span class="f">(</span><span class="b">p</span><span class="f">,</span> <span class="b">v</span><span class="f">,</span> <span class="b">v</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">;</span>
<a name="69" /><span class="Maybe">      69:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><span class="b">v1</span> <span class="f">==</span> <span class="b">v</span><span class="f">)</span><span class="f">)</span>
<a name="70" /><span class="Maybe">      70:</span>             <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="71" /><span class="Maybe">      71:</span>     <span class="f">}</span>
<a name="72" /><span class="Maybe">      72:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="f">}</span>
<a name="74" /><span class="Maybe">      74:</span> <span class="f">#</span><span class="n">endif</span>
<a name="75" /><span class="Maybe">      75:</span> 
<a name="76" /><span class="Maybe">      76:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">atomic_dec_unless_positive</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic_dec_unless_positive</span><span class="f">(</span><span class="b">atomic_t</span> <span class="f">*</span><span class="b">p</span><span class="f">)</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="f">{</span>
<a name="79" /><span class="Maybe">      79:</span>     <span class="m">int</span> <span class="b">v</span><span class="f">,</span> <span class="b">v1</span><span class="f">;</span>
<a name="80" /><span class="Maybe">      80:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">v</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span> <span class="b">v</span> <span class="f">&lt;=</span> <span class="c">0</span><span class="f">;</span> <span class="b">v</span> <span class="f">=</span> <span class="b">v1</span><span class="f">)</span> <span class="f">{</span>
<a name="81" /><span class="Maybe">      81:</span>         <span class="b">v1</span> <span class="f">=</span> <span class="b">atomic_cmpxchg</span><span class="f">(</span><span class="b">p</span><span class="f">,</span> <span class="b">v</span><span class="f">,</span> <span class="b">v</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span><span class="f">;</span>
<a name="82" /><span class="Maybe">      82:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><span class="b">v1</span> <span class="f">==</span> <span class="b">v</span><span class="f">)</span><span class="f">)</span>
<a name="83" /><span class="Maybe">      83:</span>             <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="84" /><span class="Maybe">      84:</span>     <span class="f">}</span>
<a name="85" /><span class="Maybe">      85:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="86" /><span class="Maybe">      86:</span> <span class="f">}</span>
<a name="87" /><span class="Maybe">      87:</span> <span class="f">#</span><span class="n">endif</span>
<a name="88" /><span class="Maybe">      88:</span> 
<a name="89" /><span class="Maybe">      89:</span> <span class="k">/*</span>
<a name="90" /><span class="Maybe">      90:</span> <span class="k"> * atomic_dec_if_positive - decrement by 1 if old value positive</span>
<a name="91" /><span class="Maybe">      91:</span> <span class="k"> * @v: pointer of type atomic_t</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="k"> *</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="k"> * The function returns the old value of *v minus 1, even if</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="k"> * the atomic variable, v, was not decremented.</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="k"> */</span>
<a name="96" /><span class="Maybe">      96:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">atomic_dec_if_positive</span>
<a name="97" /><span class="Maybe">      97:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic_dec_if_positive</span><span class="f">(</span><span class="b">atomic_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="98" /><span class="Maybe">      98:</span> <span class="f">{</span>
<a name="99" /><span class="Maybe">      99:</span>     <span class="m">int</span> <span class="b">c</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="b">dec</span><span class="f">;</span>
<a name="100" /><span class="Maybe">     100:</span>     <span class="b">c</span> <span class="f">=</span> <span class="b">atomic_read</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="101" /><span class="Maybe">     101:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">;</span><span class="f">;</span><span class="f">)</span> <span class="f">{</span>
<a name="102" /><span class="Maybe">     102:</span>         <span class="b">dec</span> <span class="f">=</span> <span class="b">c</span> <span class="f">-</span> <span class="c">1</span><span class="f">;</span>
<a name="103" /><span class="Maybe">     103:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="b">dec</span> <span class="f">&lt;</span> <span class="c">0</span><span class="f">)</span><span class="f">)</span>
<a name="104" /><span class="Maybe">     104:</span>             <span class="m">break</span><span class="f">;</span>
<a name="105" /><span class="Maybe">     105:</span>         <span class="b">old</span> <span class="f">=</span> <span class="b">atomic_cmpxchg</span><span class="f">(</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">,</span> <span class="b">c</span><span class="f">,</span> <span class="b">dec</span><span class="f">)</span><span class="f">;</span>
<a name="106" /><span class="Maybe">     106:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><span class="b">old</span> <span class="f">==</span> <span class="b">c</span><span class="f">)</span><span class="f">)</span>
<a name="107" /><span class="Maybe">     107:</span>             <span class="m">break</span><span class="f">;</span>
<a name="108" /><span class="Maybe">     108:</span>         <span class="b">c</span> <span class="f">=</span> <span class="b">old</span><span class="f">;</span>
<a name="109" /><span class="Maybe">     109:</span>     <span class="f">}</span>
<a name="110" /><span class="Maybe">     110:</span>     <span class="m">return</span> <span class="b">dec</span><span class="f">;</span>
<a name="111" /><span class="Maybe">     111:</span> <span class="f">}</span>
<a name="112" /><span class="Maybe">     112:</span> <span class="f">#</span><span class="n">endif</span>
<a name="113" /><span class="Maybe">     113:</span> 
<a name="114" /><span class="Maybe">     114:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">CONFIG_ARCH_HAS_ATOMIC_OR</span>
<a name="115" /><span class="Maybe">     115:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">atomic_or</span><span class="f">(</span><span class="m">int</span> <span class="b">i</span><span class="f">,</span> <span class="b">atomic_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="116" /><span class="Maybe">     116:</span> <span class="f">{</span>
<a name="117" /><span class="Maybe">     117:</span>     <span class="m">int</span> <span class="b">old</span><span class="f">;</span>
<a name="118" /><span class="Maybe">     118:</span>     <span class="m">int</span> <span class="m">new</span><span class="f">;</span>
<a name="119" /><span class="Maybe">     119:</span> 
<a name="120" /><span class="Maybe">     120:</span>     <span class="m">do</span> <span class="f">{</span>
<a name="121" /><span class="Maybe">     121:</span>         <span class="b">old</span> <span class="f">=</span> <span class="b">atomic_read</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="122" /><span class="Maybe">     122:</span>         <span class="m">new</span> <span class="f">=</span> <span class="b">old</span> <span class="f">|</span> <span class="b">i</span><span class="f">;</span>
<a name="123" /><span class="Maybe">     123:</span>     <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="b">atomic_cmpxchg</span><span class="f">(</span><span class="b">v</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">)</span> <span class="f">!=</span> <span class="b">old</span><span class="f">)</span><span class="f">;</span>
<a name="124" /><span class="Maybe">     124:</span> <span class="f">}</span>
<a name="125" /><span class="Maybe">     125:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* #ifndef CONFIG_ARCH_HAS_ATOMIC_OR */</span>
<a name="126" /><span class="Maybe">     126:</span> 
<a name="127" /><span class="Maybe">     127:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">-</span><span class="b">generic</span><span class="f">/</span><span class="b">atomic</span><span class="f">-</span><span class="m">long</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="128" /><span class="False">     128:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_GENERIC_ATOMIC64</span>
<a name="129" /><span class="False">     129:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">-</span><span class="b">generic</span><span class="f">/</span><span class="b">atomic64</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="130" /><span class="Maybe">     130:</span> <span class="f">#</span><span class="n">endif</span>
<a name="131" /><span class="True">     131:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_ATOMIC_H */</span>
<a name="132" /><span class="True">     132:</span> </pre>
  </body>
</html>
